package chapter6;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * This applet is a simple demo of using a JLable, some JSliders, and a JComboBox 
 * and laying them out in a GridLayout.  This class contains a main() routine,
 * so that it can also be run as a stand-alone application.
 *  */
public class SliderAndComboBoxDemo extends JApplet {

   /**
    * The main() routine simply opens a window that shows a panel of type
    * ContentPane, where ContentPane is a nested class that does all the
    * work of the program.  Note that the main() routine uses the pack()
    * method of the JFrame, so that the size of the ContentPane will be
    * equal to its preferred size.
    */
   public static void main(String[] args) {
      JFrame window = new JFrame("Layout Demo");
      ContentPanel content = new ContentPanel();
      window.setContentPane(content);
      window.pack();
      window.setLocation(100,100);
      window.setResizable(false);
      window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      window.setVisible(true);
   }
   
   /**
    * The init() method of the applet simply uses a panel of type
    * ContentPane as the content pane of the applet.
    */
   public void init() {
      setContentPane( new ContentPanel() );
   }
   
    /**
     * This nested class defines the JPanel that holds the four components:
     * a label that displays the message "Hello  World", a combo box that
     * lets the user choose the style of the font in the label, a slider
     * that changes the background color of the label, and another slider
     * that changes the foreground color of the label.
     */
   public static class ContentPanel extends JPanel
                     implements ActionListener, ChangeListener{
      
      private JLabel displayLabel;        // Components that will be 
      private JComboBox fontStyleSelect;  //          displayed in this panel.
      private JSlider bgColorSlider, fgColorSlider;
      
      /**
       * The constructor creates components, sets up listening, and adds
       * the components to the panel.
       */
      public ContentPanel() {
         
         /* Create the sliders, and set up the panel to listen for
            ChangeEvents that are generated by the sliders. */
         
         bgColorSlider = new JSlider(0,255,100);
         bgColorSlider.addChangeListener(this);
         
         fgColorSlider = new JSlider(0,255,200);
         fgColorSlider.addChangeListener(this);

         /* Create the combo box, and add four items to it listing
            different font styles.  Set up the panel to listen for
            ActionEvents from the combo box. */

         fontStyleSelect = new JComboBox();
         fontStyleSelect.addItem("Plain Font");
         fontStyleSelect.addItem("Italic Font");
         fontStyleSelect.addItem("Bold Font");
         fontStyleSelect.addItem("Bold Italic Font");
         fontStyleSelect.setSelectedIndex(2);
         fontStyleSelect.addActionListener(this);
         
         /* Create the display label, with properties to match the
            values of the sliders and the setting of the combo box. */
         
         displayLabel = new JLabel("Hello World!", JLabel.CENTER);
         displayLabel.setOpaque(true);
         displayLabel.setBackground( new Color(100,100,100) );
         displayLabel.setForeground( new Color(255, 200, 200) );
         displayLabel.setFont( new Font("Serif", Font.BOLD, 30) );
         
         /* Set the layout for the panel, and add the four components. 
            Use a GridLayout with 4 rows and 1 columns. */
         
         setLayout(new GridLayout(4,1));
         add(displayLabel);
         add(bgColorSlider);
         add(fgColorSlider);
         add(fontStyleSelect);
         
      } // end constructor

      /**
       * This method will be called when the user changes the selection
       * in the combo box.  The method just changes the label's font to
       * match the new selection.
       */
      public void actionPerformed(ActionEvent evt) {
         switch ( fontStyleSelect.getSelectedIndex() ) {
         case 0:
            displayLabel.setFont( new Font("Serif", Font.PLAIN, 30) );
            break;
         case 1:
            displayLabel.setFont( new Font("Serif", Font.ITALIC, 30) );
            break;
         case 2:
            displayLabel.setFont( new Font("Serif", Font.BOLD, 30) );
            break;
         case 3:
            displayLabel.setFont( new Font("Serif", Font.BOLD + Font.ITALIC, 30) );
            break;
         }
      }

      /**
       * This method is called when the value is changed on either of the
       * sliders.  It sets the foreground or background color of the label
       * to match the value on the slider that has changed. 
       */
      public void stateChanged(ChangeEvent evt) {
         if (evt.getSource() == bgColorSlider) {
            int bgVal = bgColorSlider.getValue();
            displayLabel.setBackground( new Color(bgVal,bgVal,bgVal) );
               // NOTE:  The backgroud color is a shade of gray,
               //        determined by the setting on the slider.
         }
         else {
            int fgVal = fgColorSlider.getValue();
            displayLabel.setForeground( new Color( 255, fgVal, fgVal) );
               // Note:  The foreground color ranges from pure red to pure
               //        white as the slider value increases from 0 to 255.
         }
      }

   } // end nested class ContentPane
   
} // end class SliderAndComboBoxDemo

